package Study.Study.List;

import java.util.Objects;

public class Linked {
    private Node first;
    private int size;

    /**
     * 获取链表的长度
     *
     * @return
     */
    public int size() {
        return size;
    }
    /**
     * 返回链表是否是空的
     *
     * @return
     */
    public boolean isEmpty() {
        if (size <= 0) {
            return true;
        }else {
            return false;
        }
    }
    /**
     * 返回链表是否包含某个对象
     *
     * @param o
     * @return
     */
    public boolean contains(Object o) {
       Node t = first;
       while (! Objects.equals(t.value, o)){
           t = t.next;
           if (t == null){
               return false;
           }
       }
           return true;
    }
    /**
     * 添加元素到链表中
     *
     * @param o
     * @return
     */
    public boolean add(Object o) {
        // Object --> 放到Node对象里面去
        Node node = new Node(o, null);
        if (first == null) {
            first = node;
            size ++;
            return true;
        }
        Node t = first;
        while (t.next != null) {
            t = t.next;
        }
        t.next = node;
        size ++ ;
        return true;
    }
    public boolean add1(Object o){
        Node node = new Node(o,null);
        if (first == null){
            first = node;
            size ++;
            return true;
        }
        Node t = first;
        while ( t != null ){
            t = t.next;
        }
        t.next = node;
        return true;
    }
    /**
     * 删除某个元素
     *
     * @param o
     * @return
     */
    public boolean remove(Object o) {
        if (isEmpty()){
            System.out.print("链表为空！");
            return false;
        }
        Node t = first;
        Node prev = null;
        while (! Objects.equals(t.value,o)){
            prev = t;
            t = t.next;
            if (t == null){
                System.out.print("链表中没有该元素！");
                return false;
            }
        }
        if (prev == null){
            Node x = first.next;
            first.next = null;
            first = x;
            size -- ;
           return true;
        }
        Node node = t.next;
        prev.next = node;
        size --;
        return true;
    }
    public boolean delete(Object obj) {
        if (isEmpty()) {
            return false;
        }
        // 如果是第一个元素，直接让 first 为 null 并且只有一个元素
        if (Objects.equals(first.value,obj ) && first.next == null) { // 要删除恰好是第一个元素 并且只有一个元素
            first = null;
            size--;
            return true;
        }
        // 如果删除第一个元素，让first指向下一个元素
        if (Objects.equals(first.value, obj)) {
            first = first.next;
            size--;
            return true;
        }
        // 删除其他位置元素
        Node t = first; // 前一个元素
        //  Objects.equals(t.getValue(), obj) == true  删除的依据
        while (!Objects.equals(t.next.value, obj)) {
            t = t.next;
            if (t.next == null) { // 说明是t最后一个元素了
                return false;
            }
        }
        // 找到了要删除的元素 t.getNext()
        Node node = t.next; // 要删除的元素
        t.next = node.next;
        size--;
        return true;
    }
    /**
     * 获取指定位置的元素
     *
     * @param index
     * @return
     */
    public Object get(int index) {
        if (index < 0 || index >= size) {
            return null;
        }
        Node t = first;
        for (int i = 0; i < index ; i ++){
          t = t.next;
      }
      return t.value;
    }
    /**
     * 返回指定元素的下标
     *
     * @param o
     * @return
     */
    public int indexOf(Object o) {
        if (isEmpty()){
            return -1;
        }
        int count = 0;
        Node t = first;
        while (! Objects.equals(t.value, o)){
            if (t.next== null){
                System.out.println("未找到元素！");

            }
            t = t.next;
            count ++;

        }
        return count;
    }
    /**
     * 将链表转换成字符串 Linked[元素, 元素, ...]
     *
     * @return
     */
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder("Node:[");
        Node t = first;
        while (t.next != null){
            sb.append(t.value + ",");
            t = t.next;
        }
        sb.append(t.value + "]");
        return sb.toString();
    }

    class Node {
        private Object value;
        private Node next;
        public Node(Object value, Node next) {
            this.value = value;
            this.next = next;
        }
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            Node node = (Node) o;
            return Objects.equals(value, node.value) && Objects.equals(next,
                    node.next);
        }
    }
}
